package bing.lucene.helloworld;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;

/**
 * File转化为Document的工具类
 * @author trs
 *
 */
public class File2DocumentUtils {
	
	/*
	 * 提取每个文件的name、content、size、path四项，进行建立索引，存储。
	 */
	public static Document file2Document(File file) {
		Document doc=new Document();
		//将文件名和内容分词，建立索引，存储。而内容通过readFileContent方法读取出来。
		doc.add(new Field("name",file.getName(),Store.YES,Index.ANALYZED));
		doc.add(new Field("content",readFileContent(file),Store.YES,Index.ANALYZED));
		
		//将文件大小存储，建立索引，但不分词，路径则不需要建立索引。
		doc.add(new Field("size",String.valueOf(file.length()),Store.YES,Index.NOT_ANALYZED));
		doc.add(new Field("path",file.getParent(),Store.YES,Index.NO));
		
		return doc;
	}
	
	/**
	 * 读取文件内容。通过FileInputStream输入文件流，InputStreamReader读取输入流，
	 * 再用BufferedReader一行一行读取出来。
	 * @param file
	 * @return
	 */
	public static String readFileContent(File file) {
		try {
			BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			//存储file的内容
			StringBuilder content=new StringBuilder();
			
			for(String line=null;(line=reader.readLine())!=null;) {
				content.append(line).append("\n");
			}
			
			return content.toString();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
	
	public static void printDocumentInfo(Document doc) {
		//第一种，先getField,然后获取值
		//doc.getField("name").stringValue();
		
		//第二种，直接通过get读取
		System.out.println("name: "+doc.get("name"));
		System.out.println("content: "+doc.get("content"));
		System.out.println("size: "+doc.get("size"));
		System.out.println("path: "+doc.get("path"));
	}
	
	
	
	
}
